/*
 * Clase encargada de generar la interfaz de la vista salón
 * 
 */
package grest.view;

import grest.controller.CntrlrKeysVistaSalon;
import grest.controller.CtrlrVistaSalon;
import java.awt.*;
import java.awt.event.*;
import java.util.Observable;
import javax.swing.*;
import javax.swing.table.*;
import grest.controller.CntrlrMouseTMesas;
import grest.model.Mozos;
import grest.model.Reservas;
import java.util.Observer;
/**
 *
 * @author Santiago, Rodrigo, Agustín
 */
public class VistaSalon extends JPanel implements Observer{
    public final static String ABRIR_MESA = "Abrir mesa";
    public final static String PEDIDOS = "Pedidos";
    public final static String INFO = "Info";
    private JSplitPane panel = new JSplitPane();
    private JLabel titulo = new JLabel("Salón");
    private JTable tablaMesas= new JTable();
    private JScrollPane scpTblMesas = new JScrollPane(tablaMesas);
    private JPanel vistaContextual = new JPanel();
    //"Cards para el panel contextual"
    private JPanel info = new JPanel();
    private JPanel altaMesa = new JPanel();
    private JPanel pedidos = new JPanel();
    //Componenetes del panel de ifno
    JLabel lblInfo = new JLabel("g-Rest");
    //Componentes del panel de pedidos
    private JTable tablaPedidos= new JTable();
    private JScrollPane scpTblPedidos = new JScrollPane(tablaPedidos);
    private JPanel pnlBtnsPedidos = new JPanel();
    private JButton btnCerrarMesa = new JButton("Cerrar Mesa");    
    private JButton btnRefrescar = new JButton("Refrescar");    
    private JButton btnBorrarPed = new JButton("Borrar pedidos");    
    //Componentes del panel de mesas
    private JLabel lblAbrirMesa = new JLabel("Abrir mesa");
    private JPanel pnlPersonas = new JPanel();
    private FlowLayout flPnlPersonas = new FlowLayout();
    private JLabel lblCantPer = new JLabel("Cantidad de comensales:");
    private JTextField txtCantidadP = new JTextField();
    private JPanel pnlAgregarMozos = new JPanel();
    private JPanel pnlInnerAMLeft = new JPanel();
    private JPanel pnlInnerAMCenter = new JPanel();
    private JPanel pnlInnerAMRigth = new JPanel();
    private JLabel lblCodMoz = new JLabel("Cód:");
    private JTextField txtCodMoz = new JTextField();
    private JButton btnAgregarMoz = new JButton("+");
    private JButton btnBuscarMoz = new JButton("Buscar");
    private JButton btnQuitarMoz = new JButton("-");
    private JLabel lblMozosSelec = new JLabel("Mozos asignados");
    private JList lstListaMozos = new JList();
    private JPanel pnlReserva = new JPanel();
    private JLabel lblNroReserva = new JLabel("Número:");
    private JTextField txtNroReserv = new JTextField();
    private JButton btnBuscarReserv = new JButton("Buscar");
    private JPanel btnCont=new JPanel();
    private FlowLayout flEsquemaBtn = new FlowLayout();
    private JButton btnAbrir = new JButton("Abrir mesa");
    private CtrlrVistaSalon controller=null;
    //Propiedades
    private String vistaContextualAct = new String();
    
    //*****Cosntructor
    public VistaSalon(){
        CtrlrVistaSalon controladorSalon = new CtrlrVistaSalon(this);
        CntrlrMouseTMesas controladorMouseTMesas = new CntrlrMouseTMesas(this);
        controller=controladorSalon;
        btnAbrir.addActionListener(controladorSalon);
        btnAgregarMoz.addActionListener(controladorSalon);
        btnQuitarMoz.addActionListener(controladorSalon);
        tablaMesas.addMouseListener(controladorMouseTMesas);
        KeyListener ctrlTxtIng = new KeyAdapter(){
            @Override
            public void keyTyped(KeyEvent e)
            {
                char caracter = e.getKeyChar();
                // Verificar si la tecla pulsada no es un digito
                if(((caracter < '0') ||
                (caracter > '9')) &&
                (caracter != '\b' /*corresponde a BACK_SPACE*/)){
                    e.consume();  // ignorar el evento de teclado
                }
            }
        };
        txtNroReserv.addKeyListener(ctrlTxtIng);
        txtCodMoz.addKeyListener(ctrlTxtIng);
        txtCantidadP.addKeyListener(ctrlTxtIng);
        btnCerrarMesa.addActionListener(controladorSalon);
        btnRefrescar.addActionListener(controladorSalon);
        btnBorrarPed.addActionListener(controladorSalon);
        btnBuscarMoz.addActionListener(controller);
        btnBuscarReserv.addActionListener(controller);
        //Establezco el orden de los tabs
        TabPolicy ordenTabuladorVista =new TabPolicy();
        ordenTabuladorVista.addIndexedComponent(tablaMesas);
        ordenTabuladorVista.addIndexedComponent(vistaContextual);
        //--->La vista delega el foco al panel activo
        vistaContextual.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e){
                if(vistaContextualAct.equals(ABRIR_MESA))altaMesa.requestFocus();
                else if(vistaContextualAct.equals(PEDIDOS))pedidos.requestFocus(); 
            }
        });
        this.setFocusTraversalPolicy(ordenTabuladorVista);
        this.setFocusCycleRoot(true);
        this.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e){
                tablaMesas.requestFocus();
            }
        });
        
        TabPolicy ordenTabuladorAbrirMesa = new TabPolicy();
        ordenTabuladorAbrirMesa.addIndexedComponent(txtCantidadP);
        ordenTabuladorAbrirMesa.addIndexedComponent(txtCodMoz);
        ordenTabuladorAbrirMesa.addIndexedComponent(btnAgregarMoz);
        ordenTabuladorAbrirMesa.addIndexedComponent(txtNroReserv);
        ordenTabuladorAbrirMesa.addIndexedComponent(btnAbrir);
        altaMesa.setFocusTraversalPolicy(ordenTabuladorAbrirMesa);
        altaMesa.setFocusCycleRoot(true);
        altaMesa.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e){
                txtCantidadP.requestFocus();
            }
        });
        TabPolicy ordenTabuladorPedidos = new  TabPolicy();
        ordenTabuladorPedidos.addIndexedComponent(btnCerrarMesa);
        ordenTabuladorPedidos.addIndexedComponent(btnRefrescar);
        ordenTabuladorPedidos.addIndexedComponent(btnBorrarPed);
        pedidos.setFocusTraversalPolicy(ordenTabuladorPedidos);
        pedidos.setFocusCycleRoot(true);
        pedidos.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e){
                btnCerrarMesa.requestFocus();
            }
        });
        //Atajos de tecla
        btnAbrir.setMnemonic(KeyEvent.VK_A);
        btnCerrarMesa.setMnemonic(KeyEvent.VK_C);
        btnRefrescar.setMnemonic(KeyEvent.VK_R);
        btnBorrarPed.setMnemonic(KeyEvent.VK_B);
    }
    /**
     * Heredado de la clase JTable
     * @param g 
     */
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        this.setLayout(new BorderLayout(5,5));
        this.add(titulo,BorderLayout.NORTH);
        this.add(panel,BorderLayout.CENTER);
        panel.setLeftComponent(scpTblMesas);
        panel.setRightComponent(vistaContextual);
        panel.setDividerLocation(0.6);
        //Elaboro paneles de las vistas contextuales
        //**Pedidos
        pedidos.setLayout(new BorderLayout(5,5));
        pedidos.add(scpTblPedidos,BorderLayout.CENTER);
        pnlBtnsPedidos.setLayout(new GridLayout(1, 3));
        pnlBtnsPedidos.add(btnCerrarMesa);
        pnlBtnsPedidos.add(btnRefrescar);
        pnlBtnsPedidos.add(btnBorrarPed);
        pedidos.add(pnlBtnsPedidos,BorderLayout.SOUTH);
        //**Alta mesa
        altaMesa.setLayout(new GridLayout(5, 1,5,5));
        altaMesa.add(lblAbrirMesa);
        lblAbrirMesa.setFont(new Font("SansSerif", Font.BOLD, 18));
        flPnlPersonas.setAlignment(FlowLayout.LEFT);
        pnlPersonas.setLayout(flPnlPersonas);
        pnlPersonas.add(lblCantPer);
        txtCantidadP.setPreferredSize(new Dimension(100,32));
        pnlPersonas.add(txtCantidadP);
        altaMesa.add(pnlPersonas);
        pnlAgregarMozos.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Asignar mozos"),
                        BorderFactory.createEmptyBorder(10,10,10,10)));
        pnlAgregarMozos.setLayout(new GridLayout(1, 3));
        pnlInnerAMLeft.setLayout(new FlowLayout(FlowLayout.LEFT));
        pnlInnerAMLeft.add(lblCodMoz);
        pnlInnerAMLeft.add(txtCodMoz);
        txtCodMoz.setPreferredSize(new Dimension(50, 32));
        pnlInnerAMCenter.setLayout(new GridLayout(3, 1, 0, 5));
        pnlInnerAMCenter.add(btnAgregarMoz);
        pnlInnerAMCenter.add(btnBuscarMoz);
        pnlInnerAMCenter.add(btnQuitarMoz);
        pnlInnerAMRigth.setLayout(new BorderLayout());
        pnlInnerAMRigth.add(lblMozosSelec,BorderLayout.NORTH);
        pnlInnerAMRigth.add(lstListaMozos,BorderLayout.CENTER);
        pnlAgregarMozos.add(pnlInnerAMLeft);
        pnlAgregarMozos.add(pnlInnerAMCenter);
        pnlAgregarMozos.add(pnlInnerAMRigth);
        altaMesa.add(pnlAgregarMozos);
        pnlReserva.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Reserva correspondiente"),
                        BorderFactory.createEmptyBorder(10,10,10,10)));
        pnlReserva.setLayout(new FlowLayout());
        pnlReserva.add(lblNroReserva);
        txtNroReserv.setPreferredSize(new Dimension(100,32));
        pnlReserva.add(txtNroReserv);
        pnlReserva.add(btnBuscarReserv);
        altaMesa.add(pnlReserva);       
        flEsquemaBtn.setAlignment(FlowLayout.RIGHT);
        btnCont.setLayout(flEsquemaBtn);
        btnCont.add(btnAbrir);        
        altaMesa.add(btnCont);
        
        //**Panel de información (PREDETERMINADO)
        info.setLayout(new FlowLayout());
        lblInfo.setFont(new Font("SansSerif", Font.BOLD, 18));
        info.add(lblInfo);
        //Elaboro la vista contextual
        vistaContextual.setLayout(new CardLayout(5,5));
        vistaContextual.add(altaMesa,ABRIR_MESA);
        vistaContextual.add(pedidos,PEDIDOS);
        vistaContextual.add(info,INFO);
        setVistaContext(INFO);
        CntrlrKeysVistaSalon controladorTeclas = new CntrlrKeysVistaSalon(this);
        tablaMesas.addKeyListener(controladorTeclas);
    }
    /**
     * Establece la vista contextual
     * @param modo (ABRIR_MESA,PEDIDOS)
     */
    public void setVistaContext(String modo){
        if(modo.equals(ABRIR_MESA) || modo.equals(PEDIDOS) || modo.equals(INFO) ){
             CardLayout cl = (CardLayout)(vistaContextual.getLayout());
             cl.show(vistaContextual, modo);
             vistaContextualAct=modo;
             if(modo.equals(PEDIDOS)) this.controller.refresh(tablaPedidos);
        }
    }
    /**
     * Devuelve la vista contextual actual
     * (Abrir mesa, pedidos)
     * @return String
     */
    public String getVistaContextActual(){
        return vistaContextualAct;
    }
    /**
     * Obtiene un control de la vista
     * @param nombre
     * @return 
     */
    public JComponent getControls(String nombre){
        if("tablaMesas".equals(nombre)) return tablaMesas;
        else if ("btnAbrir".equals(nombre)) return btnAbrir;
        else if ("btnAgregarMoz".equals(nombre)) return btnAgregarMoz;
        else if ("btnQuitarMoz".equals(nombre)) return btnQuitarMoz;
        else if ("lstListaMozos".equals(nombre)) return lstListaMozos;
        else if ("txtCantidadP".equals(nombre)) return txtCantidadP;
        else if ("txtNroReserv".equals(nombre)) return txtNroReserv;
        else if ("txtCodMoz".equals(nombre)) return txtCodMoz;
        else if ("btnCerrarMesa".equals(nombre)) return btnCerrarMesa;
        else if ("btnBorrarPed".equals(nombre)) return btnBorrarPed;
        else if ("btnRefrescar".equals(nombre)) return btnRefrescar;
        else if ("btnBuscarMoz".equals(nombre))return btnBuscarMoz;
        else if ("btnBuscarReserv".equals(nombre))return btnBuscarReserv;
        else if ("tablaPedidos".equals(nombre))return tablaPedidos;
        return null;
    }
    @Override
    public void update(Observable o, Object arg) {
        this.controller.refresh(tablaMesas);
    }

}
